5a0d9da75eca6c15b6e367782c9106f610837ad8,oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java,SegmentWriter,flush,#,179

Before Change


                buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
            }

            SegmentId id = segment.getSegmentId();
            log.debug("Writing data segment {} ({} bytes)", id, length);
            store.writeSegment(id, buffer, buffer.length - length, length);

After Change


        int segmentOffset = 0;
        int segmentLength = 0;

        synchronized (this) {
            if (length > 0) {
                int refcount = segment.getRefCount();

                int rootcount = roots.size();
                buffer[Segment.ROOT_COUNT_OFFSET] = (byte) (rootcount >> 8);
                buffer[Segment.ROOT_COUNT_OFFSET + 1] = (byte) rootcount;

                int blobrefcount = blobrefs.size();
                buffer[Segment.BLOBREF_COUNT_OFFSET] = (byte) (blobrefcount >> 8);
                buffer[Segment.BLOBREF_COUNT_OFFSET + 1] = (byte) blobrefcount;

                length = align(
                        refcount * 16 + rootcount * 3 + blobrefcount * 2 + length,
                        16);

                checkState(length <= buffer.length);

                int pos = refcount * 16;
                if (pos + length <= buffer.length) {
                    // the whole segment fits to the space *after* the referenced
                    // segment identifiers we've already written, so we can safely
                    // copy those bits ahead even if concurrent code is still
                    // reading from that part of the buffer
                    System.arraycopy(buffer, 0, buffer, buffer.length - length, pos);
                    pos += buffer.length - length;
                } else {
                    // this might leave some empty space between the header and
                    // the record data, but this case only occurs when the
                    // segment is >252kB in size and the maximum overhead is <<4kB,
                    // which is acceptable
                    length = buffer.length;
                }

                for (Map.Entry<RecordId, RecordType> entry : roots.entrySet()) {
                    int offset = entry.getKey().getOffset();
                    buffer[pos++] = (byte) entry.getValue().ordinal();
                    buffer[pos++] = (byte) (offset >> (8 + Segment.RECORD_ALIGN_BITS));
                    buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
                }

                for (RecordId blobref : blobrefs) {
                    int offset = blobref.getOffset();
                    buffer[pos++] = (byte) (offset >> (8 + Segment.RECORD_ALIGN_BITS));
                    buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
                }

                segmentId = segment.getSegmentId();
                segmentBuffer = buffer;
                segmentOffset = buffer.length - length;
                segmentLength = length;